iT邦幫忙

2023 iThome 鐵人賽

DAY 1
0
自我挑戰組

Django系列 第 6

Day6~ Django 漫漫長路- 一腳踏入DRF API的領域

  • 分享至 

  • xImage
  •  

大家好,我是Leo
今天我來介紹的是django rest framework,我今天會從使用者註冊開始講解/images/emoticon/emoticon30.gif
OK~~~ Let's go now!!!


還記得我們昨天已經將model寫完了,我們今天我們要來時做django framework API
以下是model的型式
https://ithelp.ithome.com.tw/upload/images/20221212/20154853smIvrtSuBt.jpg

API是什麼?


以下連結是對API的概念作介紹
對不熟悉API的朋友也可以透過這支影片,更能清楚知道API是什麼?
https://www.youtube.com/watch?v=zvKadd9Cflc

API 重點整理

  • 是一種訪問資料庫的文件型式
  • 特過輸入特定的參數,返回特定格式的資料
  • 是一種前後端常見的傳遞方式

API 常見 methods

Django REST Framework 簡稱 DRF 是一個強大且彈性的工具。

  • GET : 取得我們想要的資料,常見url型式 https://www.google.com/search?q=apple
    反斜線後面可以看到你所尋找的名字。

  • POST : 最常見之型式,常用於帳號密碼傳遞頁面,傳遞時網址沒有變化,像是寄實體信件,將寫好的信紙放入信封內,讓除了接收者外,看不出信封內的內容到底為何。

  • PUT : 修改(一筆資料),如果存在就覆蓋。

  • DELETE : 刪除資料。


django framework 使用者註冊

models/users_models.py

from django.contrib.auth.models import User
from django.db import models

class Users(models.Model):
    id =  models.AutoField(primary_key=True)
    auth_user = models.OneToOneField(User, on_delete=models.PROTECT,related_name='users')
    tel = models.CharField(max_length=255, null=True)
    language = models.IntegerField(default=1,null=True) # INT[null, note: '1:繁體中文']
    title = models.CharField(max_length=255,null=True)
    status = models.IntegerField(default=0) # INT[not null, note: '0:待認證 1:啟用 2:停用']
    created_at = models.DateTimeField(auto_now_add = True,editable=False)
    updated_at = models.DateTimeField(auto_now = True)
    deleted_at = models.DateTimeField(null=True)

models/init
引用model內的檔案

from .users_model import *

views/users.py
當request.data 所有欄位與Serializer欄位一致時則創建使用者及使用者的token

from rest_framework import generics,permissions
from rest_framework.response import Response
from ..serializers import UsersSerializer
from rest_framework.authtoken.models import Token

class UsersAPIView(generics.GenericAPIView):
    permission_classes = (permissions.AllowAny,)
    authentication_classes = []

    def post(self, request, *args):
        serializer = UsersSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            user = serializer.save()
            Token.objects.get_or_create(user=serializer.instance)
            return Response({'success': True,
                             'id': user.id,
                             'username': user.username,
                             'message': "Account created successfully"},
                            status=201)
        return Response({'success': False,
                         'message': ("Account repeat please change the other.")},
                        status=400)

views/init.py
引用model內的檔案

from .users import *

serializers/users_ser.py

from rest_framework import serializers
from django.contrib.auth.models import User
from rest_framework.validators import UniqueValidator
from django.contrib.auth.password_validation import validate_password
from website.models import Users

class UsersSerializer(serializers.ModelSerializer):
    username = serializers.CharField(
        required=True,
        validators=[UniqueValidator(queryset=User.objects.all())],
    ) #比對username是否重複
    password = serializers.CharField(write_only=True, required=True, validators=[validate_password],)
    email = serializers.EmailField(write_only=True, required=True)

    tel = serializers.CharField(write_only=True, required=False,allow_null=True)
    first_name = serializers.CharField(write_only=True, required=False,allow_null=True)
    last_name = serializers.CharField(write_only=True, required=False,allow_null=True)
    class Meta: 
        model = User
        fields = ('username', 'password', 'email', 'tel', 'first_name','last_name')

    def create(self, validated_data): #創建 因為來自於User,Users的model
        user = User(
            username=validated_data['username'],
            email=validated_data['email'],
            password=validated_data['password'],
            first_name=validated_data['first_name'],
            last_name=validated_data['last_name'],
        )
        user.set_password(validated_data['password']) #加密
        user.save()

        users = Users.objects.create(
            auth_user=user, #auth_user 為一對一關聯的欄位
            tel=validated_data['tel']
        )

        users.save()
        return user

serializers/init.py
引用serializer內的檔案

from .users_ser import *

階層圖

 '|-- website',
  '    |-- apps.py',
  '    |-- forms.py',
  '    |-- __init__.py',
  '    |-- migrations',
  '    |   |-- 0001_initial.py',
  '    |   |-- __init__.py',
  '    |-- models',
  '    |   |-- users_model.py',
  '    |   |-- __init__.py',
  '    |-- serializers',
  '    |   |-- users_ser.py',
  '    |   |-- __init__.py',
  '    |-- views',
  '    |   |-- users.py',
  '    |   |-- __init__.py',

postman測試

Postman 是一個模擬 HTTP Request 的使用工具,一些常見的 HTTP 的請求方式 GET、POST、PUT、DELETE,而它的功能是能夠快速的測試 API 是否能夠正常的請求資料,並返回正確的Response。

如果還未下載的捧油們,以下是下載連結
https://dl.pstmn.io/download/latest/win64

https://ithelp.ithome.com.tw/upload/images/20221212/20154853G7sggsXQZK.jpg


今天介紹的是使用者註冊,明天我預計從Serializers介紹一些概念與使用方法
我們明天見,各位掰掰~~~/images/emoticon/emoticon29.gif


上一篇
Day5~Django 漫漫長路- model的基本介紹
下一篇
Day7~Django 漫漫長路- 手把手hoding serializers
系列文
Django30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言